package com.iteaj.network.client;

import com.iteaj.network.ProtocolException;
import com.iteaj.network.ProtocolPreservable;
import com.iteaj.network.server.AbstractServerProtocol;

/**
 * 用来声明可以处理应用客户端和设备之间的同步调用
 * @param <T>
 */
public interface AppClientSync<T extends AppClientSync> extends ProtocolPreservable {

    /**
     * 指定超时时间
     * @param timeout
     * @return
     */
    T timeout(long timeout);

    /**
     * 获取超时时间
     * @return
     */
    long getTimeout();

    /**
     * 发起请求
     * @return T
     * @throws ProtocolException
     */
    T request() throws ProtocolException;

    /**
     * 此次协议是否由客户端协议发起并且调用的
     * @return
     */
    boolean isClientStart();

    T setClientStart(boolean start);

    /**
     * 返回应用客户端主动发起的协议
     * @return
     */
    AbstractServerProtocol appInitiativeProtocol();

    AppClientSync setAppInitiativeProtocol(AbstractServerProtocol protocol);
}
